package com.coldwindblows.blog.utils;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

/**
 * ip 工具类
 * Created by ColdWindBlows on 2018/07/05
 *
 */
public class IPKit {
	
	/**
	 * 
	 * @param request
	 * @return
	 */
	public static String getIpAddrByRequest(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");
		if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		
		return ip;
	}
	
	public static String getRealIp() throws SocketException {
		String localip = null;//本地ip,如果没有配置外网ip则返回他
		String netip = null;//外网ip
		
		Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
		InetAddress ip = null;
		boolean finded = false;// 是否找到外网ip
		while(netInterfaces.hasMoreElements() && !finded) {
			NetworkInterface ni = netInterfaces.nextElement();
			Enumeration<InetAddress> address = ni.getInetAddresses();
			while(address.hasMoreElements()) {
				ip = address.nextElement();
				if(!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && !ip.getHostAddress().contains(":")) {
					// 外网ip
					netip = ip.getHostAddress();
					finded = true;
					break;
				} else if(ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && !ip.getHostAddress().contains(":")) {
					// 内网ip
					localip = ip.getHostAddress();
				}
			}
		}
		
		if(netip != null && !"".equals(netip)) {
			return netip;
		} else {
			return localip;
		}
	}
}
